<template>
  <!-- header部分 -->
    <header>
        <font-awesome-icon @click="router.go(-1)" :icon="['fas', 'angle-left']" style="color: white;font-size: 6vw;position: absolute;left: 0"/>
        <p>{{route.name}}</p>
    </header>
  <!-- 表单部分 -->
    <ul class="form-box">
        <li>
            <div class="title">
                联系人：
            </div>
            <div class="content">
                <input type="text" v-model="addressForm.contactName" placeholder="联系人
姓名">
            </div>
        </li>
        <li>
            <div class="title">
                性别：
            </div>
            <div class="content" style="font-size: 3vw;">
                <input type="radio" v-model="addressForm.contactSex" value=1
                       style="width:6vw;height:3.2vw;">男
                <input type="radio" v-model="addressForm.contactSex" value=0
                       style="width:6vw;height:3.2vw;">女
            </div>
        </li>
        <li>
            <div class="title">
                电话：
            </div>
            <div class="content">
                <input type="tel" v-model="addressForm.contactTel" placeholder="电话">
            </div>
        </li>
        <li>
            <div class="title">
                收货地址：
            </div>
            <div class="content input-address">
                <div style="width: 100%;display: flex;align-items: center;justify-content: center">
                    <el-cascader size='small' :options='options' v-model='selectedOptions' @change='addressChange'></el-cascader>
                    <el-icon v-if="isLoading" class="is-loading">
                        <Loading />
                    </el-icon>
                    <button class="add-btn" v-else @click="getLocation()">获取</button>
                </div>
            </div>
        </li>
        <li>
            <div class="title">
                详细地址：
            </div>
            <div class="content">
                <input style="width: 70%;" type="text" v-model="addressForm.address" placeholder="详细地址">
            </div>
        </li>
        <li>
           <div id='container'></div>
        </li>
    </ul>
    <div class="button-add">
        <button @click="save">保存</button>
    </div>
</template>

<script setup lang="ts">
import loadBMap from "../utils/common.ts";
import {ref,reactive,onMounted} from "vue";
import { regionData,CodeToText,TextToCode } from 'element-china-area-data'
import {AddressVO} from "../type/address.js";
const options = regionData
const selectedOptions = reactive([])
const isLoading = ref(false)

const addressForm = ref<AddressVO>({
    id:0,
    userId:0,
    contactName:"",
    contactSex:0,
    contactTel:"",
    address:"",
    province:"",
    city:"",
    district:"",
    isDefaultAddress:false
})
//初始化
let map;
let point;
let geoc;
let geolocation;
const lng = ref(0)
const lat = ref(0)

const route = useRoute();
const isAdd = ref(true);
onMounted(async ()=>{
    map = new BMap.Map("container");
    //初始化北京维度
    point = new BMap.Point(116.331398, 39.897445);
    map.centerAndZoom(point, 12);
    geoc = new BMap.Geocoder();
    geolocation = new BMap.Geolocation();
    //判断从哪个路由跳转过来
    if (route.path.includes("add")){
        isAdd.value = true;
        //获取初始地图
        getLocation()
    }else{
        isAdd.value = false;
        const res = await getAddressByIdAPI(route.params.id as number)
        addressForm.value = res.data
        //地址转码显示
        convertToCode();
    }

})
/*
* 地址转码
* */
const convertToCode = ()=>{
    if (addressForm.value.province != "" && addressForm.value.city != "" && addressForm.value.district != ""){
        selectedOptions.push(TextToCode[addressForm.value.province].code)
        selectedOptions.push(TextToCode[addressForm.value.province][addressForm.value.city].code)
        selectedOptions.push(TextToCode[addressForm.value.province][addressForm.value.city][addressForm.value.district].code)
    }
}

/**
 * 获取地址
 * */
const getLocation = ()=>{
    isLoading.value = true
    geolocation.getCurrentPosition(function(r) {
        if (this.getStatus() === BMAP_STATUS_SUCCESS) {
            var mk = new BMap.Marker(r.point);
            map.addOverlay(mk);
            map.panTo(r.point);

            //获取省级数据
            const provinceData = r.address.province
            selectedOptions.splice(0,selectedOptions.length)
            selectedOptions.push(TextToCode[provinceData].code)
            //获取市编码
            selectedOptions.push(TextToCode[provinceData][r.address.city].code)
            //获取区编码
            selectedOptions.push(TextToCode[provinceData][r.address.city][r.address.district].code)


            lng.value = r.point.lng
            lat.value = r.point.lat
            var pt = r.point;

            //2D全景
            var map_2D = new BMapGL.Map('container',{showControls: true}); // 创建Map实例  并添加室内图控件
            map_2D.centerAndZoom(new BMapGL.Point(lng.value,lat.value), 19); // 初始化地图,设置中心点坐标和地图级别
            map_2D.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放




            geoc.getLocation(pt, function(rs) {
                var addComp = rs.addressComponents;
                addressForm.value.province = addComp.province
                addressForm.value.city = addComp.city
                addressForm.value.district = addComp.district
            });

        isLoading.value = false
        } else {
            console.log('failed' + this.getStatus());
        }
    }, { enableHighAccuracy: true })
}

import router from "../router";
import {useRoute} from "vue-router";
import {add, getAddressByIdAPI,update} from "../service/address.ts";
import {userStore} from "../store/user.ts";
const addressChange = (arr)=>{
    addressForm.value.province = arr[0]
    addressForm.value.city = arr[1]
    addressForm.value.district = arr[2]
}

const user = userStore()
/*
* 添加地址
* */
const save = async()=> {
    if (isAdd.value && user.loginUser){
        addressForm.value.userId = user.loginUser.id
        const res = await add(addressForm.value)
        if (res.data && res.data.id>0){
            addressForm.value = res.data
            alert("添加成功")
        }
    }else{
        const res = await update(addressForm.value)
        if (res.data){
            alert("修改成功")
        }
    }
}
</script>

<style scoped>
/******************地图*********************/
#container{
    width: 100%;
    height: 50vw;
}
/*************** header ***************/
header {
    width: 100%;
    height: 12vw;
    background-color: #0097FF;
    display: flex;
    justify-content: space-around;
    align-items: center;
    color: #fff;
    font-size: 4.8vw;
    position: fixed;
    left: 0;
    top: 0;
    z-index: 1000;
}
/*************** （表单信息） ***************/
.add-btn {
    width: 15%;
    color: #666;
    font-size: 2.5vw;
    padding: 0;
    border: 1px solid #0097FF;
    margin-left: 10vw;
}
.form-box {
    width: 100%;
    margin-top: 12vw;
}
.form-box li {
    box-sizing: border-box;
    padding: 4vw 3vw 0vw 3vw;
    display: flex;
}
.form-box li .title {
    flex: 0 0 18vw;
    font-size: 3vw;
    font-weight: 700;
    color: #666;
}
.form-box li .content {
    flex: 1;
    display: flex;
    align-items: center;
}
.input-address{
    flex-direction: column;
}
.form-box li .content input {
    border: none;
    outline: none;
    width: 100%;
    height: 4vw;
    font-size: 3vw;
}
.button-add {
    box-sizing: border-box;
    padding: 4vw 3vw 0vw 3vw;
}
.button-add button {
    width: 100%;
    height: 10vw;
    font-size: 3.8vw;
    font-weight: 700;
    border: none;
    outline: none;
    border-radius: 4px;
    color: #fff;
    background-color: #38CA73;
}
</style>
